WebGL GPUã¡ã¢ãªç®¡çãæ·±ãæãäžãã倿§ãªããŒããŠã§ã¢ã§Webã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåäžãããéå±€çæŠç¥ãšãã«ãã¬ãã«æé©åæè¡ã解説ã
WebGL GPUã¡ã¢ãªé局管çïŒãã«ãã¬ãã«æé©å
ææ°ã®Webã¢ããªã±ãŒã·ã§ã³ã¯ãè€éãªã·ãŒã³ãã€ã³ã¿ã©ã¯ãã£ããªã³ã³ãã³ãã®ã¬ã³ããªã³ã°ã«WebGLãå€çšããŠãããã°ã©ãã£ãã¯ã¹åŠçã®é¢ã§ãŸããŸãé«åºŠãªèŠæ±ãããŠããŸãã ç¹ã«ãããŸããŸãªæ©èœãåãã倿§ãªããã€ã¹ã察象ãšããå Žåãæé©ãªããã©ãŒãã³ã¹ãéæããããã©ãŒãã³ã¹ã®ããã«ããã¯ãé²ãããã«ã¯ãGPUã¡ã¢ãªãå¹ççã«ç®¡çããããšãäžå¯æ¬ ã§ãã æ¬èšäºã§ã¯ãWebGLã«ãããéå±€çãªGPUã¡ã¢ãªç®¡çã®æŠå¿µãæ¢æ±ããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšã¹ã±ãŒã©ããªãã£ãåäžãããããã®ãã«ãã¬ãã«æé©åæè¡ã«çŠç¹ãåœãŠãŸãã
GPUã¡ã¢ãªã¢ãŒããã¯ãã£ã®çè§£
ã¡ã¢ãªç®¡çã®è€éãã«èžã¿èŸŒãåã«ãGPUã¡ã¢ãªã®åºæ¬çãªã¢ãŒããã¯ãã£ãçè§£ããããšãäžå¯æ¬ ã§ãã CPUã¡ã¢ãªãšã¯ç°ãªããGPUã¡ã¢ãªã¯éåžžãé床ãšå®¹éãç°ãªãããŸããŸãªã¬ãã«ãæã€éå±€çãªæ¹æ³ã§æ§æãããŠããŸãã ç°¡ç¥åããã衚çŸã«ã¯ãé垞以äžãå«ãŸããŸãã
- ã¬ãžã¹ã¿ïŒéåžžã«é«éã§ããããµã€ãºã¯éåžžã«éãããŠããŸãã ã·ã§ãŒããŒã®å®è¡äžã«äžæããŒã¿ãæ ŒçŽããããã«äœ¿çšãããŸãã
- ãã£ãã·ã¥ïŒL1ãL2ïŒïŒã¡ã€ã³GPUã¡ã¢ãªãããå°ãããé«éã§ãã é »ç¹ã«ã¢ã¯ã»ã¹ãããããŒã¿ãä¿æããŠãã¬ã€ãã³ã·ãåæžããŸãã 仿§ïŒã¬ãã«æ°ããµã€ãºïŒã¯GPUã«ãã£ãŠå€§ããç°ãªããŸãã
- GPUã°ããŒãã«ã¡ã¢ãªïŒVRAMïŒïŒGPUãå©çšã§ããäž»ãªã¡ã¢ãªããŒã«ã§ãã æå€§ã®å®¹éãæäŸããŸãããã¬ãžã¹ã¿ããã£ãã·ã¥ãããäœéã§ãã éåžžããã¯ã¹ãã£ãé ç¹ãããã¡ããã®ä»ã®å€§ããªããŒã¿æ§é ãããã«ãããŸãã
- å ±æã¡ã¢ãªïŒããŒã«ã«ã¡ã¢ãªïŒïŒã¯ãŒã¯ã°ã«ãŒãå ã®ã¹ã¬ããéã§å ±æãããã¡ã¢ãªã§ãããéåžžã«å¹ççãªããŒã¿äº€æãšåæãå¯èœã«ããŸãã
åã¬ãã«ã®é床ãšãµã€ãºã®ç¹æ§ã¯ãæé©ãªããã©ãŒãã³ã¹ãåŸãããã«ããŒã¿ãã©ã®ããã«å²ãåœãŠãã¢ã¯ã»ã¹ããå¿ èŠãããããæ±ºå®ããŸãã ãããã®ç¹æ§ãçè§£ããããšã¯ã广çãªã¡ã¢ãªç®¡çã«ãšã£ãŠéåžžã«éèŠã§ãã
WebGLã«ãããã¡ã¢ãªç®¡çã®éèŠæ§
WebGLã¢ããªã±ãŒã·ã§ã³ãç¹ã«è€éãª3Dã·ãŒã³ãæ±ããã®ã¯ã泚æããŠç®¡çããªããšããã«GPUã¡ã¢ãªã䜿ãæããå¯èœæ§ããããŸãã ã¡ã¢ãªäœ¿çšå¹çãæªããšãããã€ãã®åé¡ãçºçããå¯èœæ§ããããŸãã
- ããã©ãŒãã³ã¹ã®äœäžïŒé »ç¹ãªã¡ã¢ãªã®å²ãåœãŠãšè§£æŸã¯ã倧ããªãªãŒããŒãããããããããã¬ã³ããªã³ã°ãé ãããå¯èœæ§ããããŸãã
- ãã¯ã¹ãã£ã®ã¹ã©ãã·ã³ã°ïŒã¡ã¢ãªãããã¯ã¹ãã£ãé »ç¹ã«ããŒãããã³ã¢ã³ããŒããããšãããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããŸãã
- ã¡ã¢ãªäžè¶³ãšã©ãŒïŒå©çšå¯èœãªGPUã¡ã¢ãªãè¶ ãããšãã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããããäºæããªãåäœãçºçãããããå¯èœæ§ããããŸãã
- æ¶è²»é»åã®å¢å ïŒã¡ã¢ãªã¢ã¯ã»ã¹ãã¿ãŒã³ãéå¹ççã§ãããšãç¹ã«ã¢ãã€ã«ããã€ã¹ã§æ¶è²»é»åãå¢å ããå¯èœæ§ããããŸãã
WebGLã§å¹æçãªGPUã¡ã¢ãªç®¡çãè¡ãããšã§ãã¹ã ãŒãºãªã¬ã³ããªã³ã°ãä¿èšŒããã¯ã©ãã·ã¥ãé²ããæ¶è²»é»åãæé©åããããåªãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãå®çŸã§ããŸãã
éå±€çã¡ã¢ãªç®¡çæŠç¥
éå±€çã¡ã¢ãªç®¡çã«ã¯ã䜿çšãã¿ãŒã³ãšã¢ã¯ã»ã¹é »åºŠã«åºã¥ããŠãããŒã¿ãGPUã¡ã¢ãªéå±€ã®ããŸããŸãªã¬ãã«ã«æŠç¥çã«é 眮ããããšãå«ãŸããŸãã ç®æšã¯ãé »ç¹ã«ã¢ã¯ã»ã¹ãããããŒã¿ãããé«éãªã¡ã¢ãªã¬ãã«ïŒäŸïŒãã£ãã·ã¥ïŒã«ä¿æããã¢ã¯ã»ã¹é »åºŠã®äœãããŒã¿ãããé ãããã倧ããªã¡ã¢ãªã¬ãã«ïŒäŸïŒVRAMïŒã«ä¿æããããšã§ãã
1. ãã¯ã¹ãã£ç®¡ç
ãã¯ã¹ãã£ã¯ãWebGLã¢ããªã±ãŒã·ã§ã³ã§GPUã¡ã¢ãªã®æå€§ã®æ¶è²»è ã§ããããšããããããŸãã ãã¯ã¹ãã£ã¡ã¢ãªã®äœ¿çšãæé©åããããã«ãããã€ãã®ææ³ã䜿çšã§ããŸãã
- ãã¯ã¹ãã£å§çž®ïŒå§çž®ããããã¯ã¹ãã£ãã©ãŒãããïŒäŸïŒASTCãETCãS3TCïŒã䜿çšãããšãèŠèŠçãªå£åã䌎ãããšãªãããã¯ã¹ãã£ã®ã¡ã¢ãªãããããªã³ãã倧å¹
ã«åæžã§ããŸãã ãããã®ãã©ãŒãããã¯ãGPUäžã§ãã¯ã¹ãã£ããŒã¿ãçŽæ¥å§çž®ããã¡ã¢ãªåž¯åå¹
ã®èŠä»¶ãåæžããŸãã
EXT_texture_compression_astcãWEBGL_compressed_texture_etcãªã©ã®WebGLæ¡åŒµæ©èœã¯ããããã®ãã©ãŒãããããµããŒãããŠããŸãã - ããããããã³ã°ïŒããããããïŒãã¯ã¹ãã£ã®äºåã«èšç®ããããããŠã³ã¹ã±ãŒã«ãããããŒãžã§ã³ïŒãçæãããšããªããžã§ã¯ãã®ã«ã¡ã©ããã®è·é¢ã«åºã¥ããŠé©åãªãã¯ã¹ãã£è§£å床ãGPUãéžæã§ããããã«ãªããã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ãåäžããŸãã ããã«ããããšã€ãªã¢ã·ã³ã°ãæžå°ãããã¯ã¹ãã£ãã£ã«ã¿ãªã³ã°ã®å質ãåäžããŸãã
gl.generateMipmap()ã䜿çšããŠãããããããäœæããŸãã - ãã¯ã¹ãã£ã¢ãã©ã¹ïŒè€æ°ã®å°ããªãã¯ã¹ãã£ãåäžã®å€§ããªãã¯ã¹ãã£ïŒãã¯ã¹ãã£ã¢ãã©ã¹ïŒã«çµã¿åããããšããã¯ã¹ãã£ãã€ã³ãã£ã³ã°æäœã®æ°ãæžããããã©ãŒãã³ã¹ãåäžããŸãã ããã¯ãã¹ãã©ã€ããUIèŠçŽ ã«ç¹ã«æå¹ã§ãã
- ãã¯ã¹ãã£ããŒãªã³ã°ïŒå¯èœãªéããã¯ã¹ãã£ãåå©çšãããšããã¯ã¹ãã£ã®å²ãåœãŠãšè§£æŸæäœã®æ°ãæå°éã«æããããšãã§ããŸãã ããšãã°ãåäžã®çœããã¯ã¹ãã£ã䜿çšããŠãããŸããŸãªãªããžã§ã¯ããããŸããŸãªè²ã§çè²ã§ããŸãã
- åçãã¯ã¹ãã£ã¹ããªãŒãã³ã°ïŒå¿ èŠãªå Žåã«ã®ã¿ãã¯ã¹ãã£ãããŒããã衚瀺ãããªããªã£ããšãã«ã¢ã³ããŒãããŸãã ãã®ææ³ã¯ã倿°ã®ãã¯ã¹ãã£ãå«ãå€§èŠæš¡ãªã·ãŒã³ã«ç¹ã«åœ¹ç«ã¡ãŸãã æãéèŠãªãã¯ã¹ãã£ãæåã«ããŒãããããã«ãåªå 床ããŒã¹ã®ã·ã¹ãã ã䜿çšããŸãã
äŸïŒå€æ°ã®ãã£ã©ã¯ã¿ãŒãããŠãããããããŠããŒã¯ãªæãçãŠããã²ãŒã ãèããŠã¿ãŸãããã åè¡£æã«åå¥ã®ãã¯ã¹ãã£ãããŒããã代ããã«ããã¹ãŠã®æã®ãã¯ã¹ãã£ãå«ããã¯ã¹ãã£ã¢ãã©ã¹ãäœæã§ããŸãã åé ç¹ã®UV座æšã調æŽããŠãã¢ãã©ã¹ã®æ£ããéšåããµã³ããªã³ã°ããã¡ã¢ãªäœ¿çšéãåæžããããã©ãŒãã³ã¹ãåäžãããŸãã
2. ãããã¡ç®¡ç
é ç¹ãããã¡ãšã€ã³ããã¯ã¹ãããã¡ã¯ã3Dã¢ãã«ã®ãžãªã¡ããªããŒã¿ãæ ŒçŽããŸãã è€éãªã·ãŒã³ãã¬ã³ããªã³ã°ããã«ã¯ãå¹ççãªãããã¡ç®¡çãäžå¯æ¬ ã§ãã
- é ç¹ãããã¡ãªããžã§ã¯ãïŒVBOïŒïŒVBOã䜿çšãããšãé ç¹ããŒã¿ãGPUã¡ã¢ãªã«çŽæ¥æ ŒçŽã§ããŸãã VBOãå¹ççã«äœæãããããŒã¿ãæ ŒçŽãããŠããããšã確èªããŸãã
gl.createBuffer()ãgl.bindBuffer()ãgl.bufferData()ã䜿çšããŠVBOã管çããŸãã - ã€ã³ããã¯ã¹ãããã¡ãªããžã§ã¯ãïŒIBOïŒïŒIBOã¯ãäžè§åœ¢ãæ§æããé ç¹ã®ã€ã³ããã¯ã¹ãæ ŒçŽããŸãã IBOã䜿çšãããšãGPUã«è»¢éããå¿
èŠãããé ç¹ããŒã¿ã®éãæžããããšãã§ããŸãã
gl.createBuffer()ãgl.bindBuffer()ãgl.bufferData()ãgl.ELEMENT_ARRAY_BUFFERãšãšãã«äœ¿çšããŠIBOã管çããŸãã - åçãããã¡ïŒé »ç¹ã«å€æŽãããé ç¹ããŒã¿ã®å Žåã¯ãåçãããã¡äœ¿çšãã³ãïŒ
gl.DYNAMIC_DRAWïŒã䜿çšããŠããããã¡ãé »ç¹ã«å€æŽãããããšããã©ã€ãã«éç¥ããŸãã ããã«ããããã©ã€ãã¯åçæŽæ°ã®ããã«ã¡ã¢ãªå²ãåœãŠãæé©åã§ããŸãã ãªãŒããŒããããçºçããå¯èœæ§ããããããæ§ããã«äœ¿çšããŠãã ããã - éçãããã¡ïŒã»ãšãã©å€æŽãããªãéçé ç¹ããŒã¿ã®å Žåã¯ãéçãããã¡äœ¿çšãã³ãïŒ
gl.STATIC_DRAWïŒã䜿çšããŠããããã¡ãé »ç¹ã«å€æŽãããªãããšããã©ã€ãã«éç¥ããŸãã ããã«ããããã©ã€ãã¯éçããŒã¿ã®ã¡ã¢ãªå²ãåœãŠãæé©åã§ããŸãã - ã€ã³ã¹ã¿ã³ã·ã³ã°ïŒåããªããžã§ã¯ãã®è€æ°ã®ã³ããŒãåå¥ã«ã¬ã³ããªã³ã°ãã代ããã«ãã€ã³ã¹ã¿ã³ã·ã³ã°ã䜿çšããŠåäžã®æç»åŒã³åºãã§ã¬ã³ããªã³ã°ããŸãã ã€ã³ã¹ã¿ã³ã·ã³ã°ã¯ãæç»åŒã³åºãã®æ°ãšãGPUã«è»¢éããå¿
èŠãããããŒã¿ã®éãæžãããŸãã
ANGLE_instanced_arraysã®ãããªWebGLæ¡åŒµæ©èœã¯ãã€ã³ã¹ã¿ã³ã·ã³ã°ãæå¹ã«ããŸãã
äŸïŒæšã®æ£®ãã¬ã³ããªã³ã°ããããšãèããŠã¿ãŸãããã åããªãŒã«åå¥ã®VBOãšIBOãäœæãã代ããã«ãåäžã®VBOãšIBOã®ã»ããã䜿çšããŠåäžã®ããªãŒã¢ãã«ã衚ãããšãã§ããŸãã æ¬¡ã«ãã€ã³ã¹ã¿ã³ã·ã³ã°ã䜿çšããŠãããŸããŸãªäœçœ®ãšæ¹åã§ããªãŒã¢ãã«ã®è€æ°ã®ã³ããŒãã¬ã³ããªã³ã°ããæç»åŒã³åºãã®æ°ãšã¡ã¢ãªäœ¿çšéãå€§å¹ ã«åæžã§ããŸãã
3. ã·ã§ãŒããŒã®æé©å
ã·ã§ãŒããŒã¯ãWebGLã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã決å®ããäžã§éèŠãªåœ¹å²ãæãããŸãã ã·ã§ãŒããŒã³ãŒããæé©åãããšãGPUã®è² è·ãæžãããã¬ã³ããªã³ã°é床ãåäžãããããšãã§ããŸãã
- è€éãªèšç®ãæå°éã«æããïŒè¶
è¶é¢æ°ïŒäŸïŒ
sinãcosãpowïŒãè€éãªåå²ãªã©ãã·ã§ãŒããŒã§ã®é«äŸ¡ãªèšç®ã®æ°ãæžãããŸãã - äœç²ŸåºŠããŒã¿åã䜿çšããïŒé«ç²ŸåºŠãå¿
èŠãšããªã倿°ã«ã¯ãäœç²ŸåºŠããŒã¿åïŒäŸïŒ
mediumpãlowpïŒã䜿çšããŸãã ããã«ãããã¡ã¢ãªåž¯åå¹ ãåæžããããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãã - ãã¯ã¹ãã£ãµã³ããªã³ã°ãæé©åããïŒé©åãªãã¯ã¹ãã£ãã£ã«ã¿ãªã³ã°ã¢ãŒãïŒäŸïŒç·åœ¢ãããããããïŒã䜿çšããŠãç»è³ªãšããã©ãŒãã³ã¹ã®ãã©ã³ã¹ãåããŸãã å¿ èŠãªå Žåãé€ããç°æ¹æ§ãã£ã«ã¿ãªã³ã°ã䜿çšããªãã§ãã ããã
- ã«ãŒããå±éããïŒã·ã§ãŒããŒã®çãã«ãŒããå±éãããšãã«ãŒãã®ãªãŒããŒããããåæžããŠãããã©ãŒãã³ã¹ãåäžããå ŽåããããŸãã
- å€ãäºåèšç®ããïŒå®æ°å€ãJavaScriptã§äºåã«èšç®ããã·ã§ãŒããŒã§æ¯åèšç®ããã®ã§ã¯ãªããuniformãšããŠã·ã§ãŒããŒã«æž¡ããŸãã
äŸïŒãã©ã°ã¡ã³ãã·ã§ãŒããŒã§ãã¹ãŠã®ãã¯ã»ã«ã«å¯ŸããŠã©ã€ãã£ã³ã°ãèšç®ãã代ããã«ãåé ç¹ã«å¯ŸããŠã©ã€ãã£ã³ã°ãäºåã«èšç®ããäžè§åœ¢å šäœã§ã©ã€ãã£ã³ã°å€ãè£éããããšãæ€èšããŠãã ããã ããã«ããããã©ã°ã¡ã³ãã·ã§ãŒããŒã®è² è·ãå€§å¹ ã«è»œæžã§ããŸããç¹ã«ãè€éãªã©ã€ãã£ã³ã°ã¢ãã«ã®å Žåã
4. ããŒã¿æ§é ã®æé©å
ããŒã¿æ§é ã®éžæã¯ãã¡ã¢ãªäœ¿çšéãšããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããå¯èœæ§ããããŸãã ç¹å®ã®ã¿ã¹ã¯ã«é©ããããŒã¿æ§é ãéžæãããšãå€§å¹ ãªæ¹åã«ã€ãªããå¯èœæ§ããããŸãã
- åä»ãé
åã䜿çšããïŒåä»ãé
åïŒäŸïŒ
Float32ArrayãUint16ArrayïŒã¯ãJavaScriptã§æ°å€ããŒã¿ãå¹ççã«æ ŒçŽã§ããŸãã é ç¹ããŒã¿ãã€ã³ããã¯ã¹ããŒã¿ããã¯ã¹ãã£ããŒã¿ã«åä»ãé åã䜿çšããŠãã¡ã¢ãªãªãŒããŒããããæå°éã«æããŸãã - ã€ã³ã¿ãŒãªãŒããããé ç¹ããŒã¿ã䜿çšããïŒåäžã®VBOã§é ç¹å±æ§ïŒäŸïŒäœçœ®ãæ³ç·ãUV座æšïŒãã€ã³ã¿ãŒãªãŒãããŠãã¡ã¢ãªã¢ã¯ã»ã¹ãã¿ãŒã³ãæ¹åããŸãã ããã«ãããGPUã¯åäžã®ã¡ã¢ãªã¢ã¯ã»ã¹ã§é ç¹ã®ãã¹ãŠã®å¿ èŠãªããŒã¿ããã§ããã§ããŸãã
- äžèŠãªããŒã¿ã®éè€ãé¿ããïŒå¯èœãªéãããŒã¿ã®éè€ãé¿ããŸãã ããšãã°ãè€æ°ã®ãªããžã§ã¯ããåããžãªã¡ããªãå ±æããŠããå Žåã¯ãããããã¹ãŠã«åäžã®VBOãšIBOã®ã»ããã䜿çšããŸãã
- ã¹ããŒã¹ããŒã¿æ§é ã䜿çšããïŒã¹ããŒã¹ããŒã¿ïŒäŸïŒå€§ããªç©ºãã¹ããŒã¹ãããå°åœ¢ïŒãæ±ãå Žåã¯ãã¹ããŒã¹ããŒã¿æ§é ã䜿çšããŠã¡ã¢ãªäœ¿çšéãåæžããããšãæ€èšããŠãã ããã
äŸïŒé ç¹ããŒã¿ãæ ŒçŽããå Žåãäœçœ®ãæ³ç·ãUV座æšã«åå¥ã®é åãäœæããã®ã§ã¯ãªããåé ç¹ã®ãã¹ãŠã®ããŒã¿ãå«ãåäžã®ã€ã³ã¿ãŒãªãŒãé åããé£ç¶ããã¡ã¢ãªãããã¯ã«äœæããŸãã ããã«ãããã¡ã¢ãªã¢ã¯ã»ã¹ãã¿ãŒã³ãæ¹åããã¡ã¢ãªãªãŒããŒããããåæžã§ããŸãã
ãã«ãã¬ãã«ã¡ã¢ãªæé©åæè¡
ãã«ãã¬ãã«ã¡ã¢ãªæé©åã«ã¯ãããã«å€§ããªããã©ãŒãã³ã¹åäžãéæããããã«ãè€æ°ã®æé©åæè¡ãçµã¿åãããããšãå«ãŸããŸãã ã¡ã¢ãªéå±€ã®ããŸããŸãªã¬ãã«ã§ããŸããŸãªæè¡ãæŠç¥çã«é©çšããããšã§ãGPUã¡ã¢ãªã®äœ¿çšçãæå€§åããã¡ã¢ãªã®ããã«ããã¯ãæå°éã«æããããšãã§ããŸãã
1. ãã¯ã¹ãã£å§çž®ãšããããããã³ã°ã®çµã¿åãã
ãã¯ã¹ãã£å§çž®ãšããããããã³ã°ãäžç·ã«äœ¿çšãããšããã¯ã¹ãã£ã®ã¡ã¢ãªãããããªã³ããå€§å¹ ã«åæžããã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãã ãã¯ã¹ãã£å§çž®ã¯ãã¯ã¹ãã£ã®å šäœçãªãµã€ãºãåæžããããããããã³ã°ã¯ãªããžã§ã¯ãã®ã«ã¡ã©ããã®è·é¢ã«åºã¥ããŠGPUãé©åãªãã¯ã¹ãã£è§£å床ãéžæã§ããããã«ããŸãã ãã®çµã¿åããã«ãããã¡ã¢ãªäœ¿çšéã®åæžããã¯ã¹ãã£ãã£ã«ã¿ãªã³ã°å質ã®åäžãã¬ã³ããªã³ã°é床ã®åäžãå®çŸããŸãã
2. ã€ã³ã¹ã¿ã³ã·ã³ã°ãšãã¯ã¹ãã£ã¢ãã©ã¹ã®çµã¿åãã
ã€ã³ã¹ã¿ã³ã·ã³ã°ãšãã¯ã¹ãã£ã¢ãã©ã¹ãäžç·ã«äœ¿çšãããšãåäžãŸãã¯é¡äŒŒã®ãªããžã§ã¯ãã倿°ã¬ã³ããªã³ã°ããã®ã«ç¹ã«å¹æçã§ãã ã€ã³ã¹ã¿ã³ã·ã³ã°ã¯æç»åŒã³åºãã®æ°ãæžããããã¯ã¹ãã£ã¢ãã©ã¹ã¯ãã¯ã¹ãã£ãã€ã³ãã£ã³ã°æäœã®æ°ãæžãããŸãã ãã®çµã¿åããã«ãããæç»åŒã³åºãã®ãªãŒããŒããããåæžãããã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ãåäžããŸãã
3. åçãããã¡æŽæ°ãšã·ã§ãŒããŒæé©åã®çµã¿åãã
åçé ç¹ããŒã¿ãæ±ãå Žåãåçãããã¡æŽæ°ãšã·ã§ãŒããŒæé©åãçµã¿åããããšãããã©ãŒãã³ã¹ãåäžããŸãã åçãããã¡äœ¿çšãã³ãã䜿çšããŠããããã¡ãé »ç¹ã«å€æŽãããããšããã©ã€ãã«éç¥ããã·ã§ãŒããŒã³ãŒããæé©åããŠGPUã®è² è·ãæå°éã«æããŸãã ãã®çµã¿åããã«ãããå¹ççãªã¡ã¢ãªç®¡çãšé«éãªã¬ã³ããªã³ã°ãå®çŸããŸãã
4. åªå ãªãœãŒã¹ããŒãã£ã³ã°
çŸåšã®ã·ãŒã³ãžã®å¯èŠæ§ãšéèŠåºŠã«åºã¥ããŠãæåã«äœ¿çšããã¢ã»ããïŒãã¯ã¹ãã£ãã¢ãã«ãªã©ïŒãåªå ããã·ã¹ãã ãå®è£ ããŸãã ããã«ãããéèŠãªãªãœãŒã¹ãããã«å©çšå¯èœã«ãªããåæã®ããŒãã£ã³ã°ãšã¯ã¹ããªãšã³ã¹ãšå šäœçãªå¿çæ§ãåäžããŸãã ç°ãªãåªå 床ã¬ãã«ãæã€ããŒããã¥ãŒã®äœ¿çšãæ€èšããŠãã ããã
5. ã¡ã¢ãªããžã§ããã£ã³ã°ãšãªãœãŒã¹ã«ãªã³ã°
WebGLã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªããžã§ããã確ç«ããã¢ããªã±ãŒã·ã§ã³ãå©çšå¯èœãªã¡ã¢ãªãè¶ ããªãããã«ããããã®ãªãœãŒã¹ã«ãªã³ã°æè¡ãå®è£ ããŸãã ãªãœãŒã¹ã«ãªã³ã°ã«ã¯ãçŸåšè¡šç€ºãããŠããªãããå¿ èŠã®ãªããªãœãŒã¹ã®åé€ãŸãã¯ã¢ã³ããŒããå«ãŸããŸãã ããã¯ãã¡ã¢ãªãéãããŠããã¢ãã€ã«ããã€ã¹ã«ãšã£ãŠç¹ã«éèŠã§ãã
å®è·µçãªäŸãšã³ãŒãã¹ãããã
äžèšã§èª¬æããæŠå¿µã瀺ãããã«ãããã€ãã®å®è·µçãªäŸãšã³ãŒãã¹ããããã瀺ããŸãã
äŸïŒASTCã䜿çšãããã¯ã¹ãã£å§çž®
ãã®äŸã§ã¯ãEXT_texture_compression_astcæ¡åŒµæ©èœã䜿çšããŠãASTC圢åŒã§ãã¯ã¹ãã£ãå§çž®ããæ¹æ³ã瀺ããŸãã
const ext = gl.getExtension('EXT_texture_compression_astc');
if (ext) {
const level = 0;
const internalformat = ext.COMPRESSED_RGBA_ASTC_4x4_KHR;
const width = textureWidth;
const height = textureHeight;
const border = 0;
const data = compressedTextureData;
gl.compressedTexImage2D(gl.TEXTURE_2D, level, internalformat, width, height, border, data);
}
äŸïŒããããããçæ
ãã®äŸã§ã¯ããã¯ã¹ãã£ã®ãããããããçæããæ¹æ³ã瀺ããŸãã
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.generateMipmap(gl.TEXTURE_2D);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);
äŸïŒANGLE_instanced_arraysã䜿çšããã€ã³ã¹ã¿ã³ã·ã³ã°
ãã®äŸã§ã¯ãANGLE_instanced_arraysæ¡åŒµæ©èœã䜿çšããŠãã¡ãã·ã¥ã®è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãã¬ã³ããªã³ã°ããæ¹æ³ã瀺ããŸãã
const ext = gl.getExtension('ANGLE_instanced_arrays');
if (ext) {
const instanceCount = 100;
// Set up vertex attributes
// ...
// Draw the instances
ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, vertexCount, instanceCount);
}
ã¡ã¢ãªåæãšãããã°ã®ããã®ããŒã«
ããã€ãã®ããŒã«ã¯ãWebGLã¢ããªã±ãŒã·ã§ã³ã§ã®ã¡ã¢ãªäœ¿çšç¶æ³ã®åæãšãããã°ã«åœ¹ç«ã¡ãŸãã
- Chrome DevToolsïŒChrome DevToolsã¯ãã¡ã¢ãªäœ¿çšç¶æ³ããããã¡ã€ãªã³ã°ããã¡ã¢ãªãªãŒã¯ãç¹å®ããããã«äœ¿çšã§ããã¡ã¢ãªããã«ãæäŸããŸãã
- Spector.jsïŒSpector.jsã¯ãWebGLã®ç¶æ ãæ€æ»ããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããããã«äœ¿çšã§ããJavaScriptã©ã€ãã©ãªã§ãã
- Webgl InsightsïŒïŒNvidiaåºæã§ãããæŠå¿µçã«ã¯åœ¹ç«ã¡ãŸãïŒã WebGL Insightsã®ãããªããŒã«ãã©ã®ããã«æ©èœããããçè§£ããããšã¯ããããã°æŠç¥ãç¥ãããããšãã§ããŸããããã¹ãŠã®ãã©ãŠã¶ã«çŽæ¥é©çšã§ããããã§ã¯ãããŸããã æç»åŒã³åºãããã¯ã¹ãã£ããã®ä»ã®ãªãœãŒã¹ãæ€æ»ã§ããŸãã
ããŸããŸãªãã©ãããã©ãŒã ã«é¢ããèæ ®äºé
ããŸããŸãªãã©ãããã©ãŒã åãã«WebGLã¢ããªã±ãŒã·ã§ã³ãéçºããå Žåã¯ãåãã©ãããã©ãŒã ã®ç¹å®ã®ã¡ã¢ãªå¶çŽãšããã©ãŒãã³ã¹ç¹æ§ãèæ ®ããããšãéèŠã§ãã
- ã¢ãã€ã«ããã€ã¹ïŒã¢ãã€ã«ããã€ã¹ã¯éåžžãGPUã¡ã¢ãªãšåŠçèœåãéãããŠããŸãã ãã¯ã¹ãã£å§çž®ãããããããã³ã°ãããã³ãã®ä»ã®ã¡ã¢ãªæé©åæè¡ã䜿çšããŠãã¢ãã€ã«ããã€ã¹åãã«ã¢ããªã±ãŒã·ã§ã³ãæé©åããŸãã
- ãã¹ã¯ãããã³ã³ãã¥ãŒã¿ïŒãã¹ã¯ãããã³ã³ãã¥ãŒã¿ã¯éåžžãã¢ãã€ã«ããã€ã¹ãããå€ãã®GPUã¡ã¢ãªãšåŠçèœåãåããŠããŸãã ãã ããã¹ã ãŒãºãªã¬ã³ããªã³ã°ãä¿èšŒããããã©ãŒãã³ã¹ã®ããã«ããã¯ãé²ãããã«ããã¹ã¯ãããã³ã³ãã¥ãŒã¿åãã«ã¢ããªã±ãŒã·ã§ã³ãæé©åããããšãéèŠã§ãã
- çµã¿èŸŒã¿ã·ã¹ãã ïŒçµã¿èŸŒã¿ã·ã¹ãã ã¯ããªãœãŒã¹ãéåžžã«éãããŠããããšããããããŸãã çµã¿èŸŒã¿ã·ã¹ãã åãã«WebGLã¢ããªã±ãŒã·ã§ã³ãæé©åããã«ã¯ãã¡ã¢ãªäœ¿çšéãšããã©ãŒãã³ã¹ã«æ³šæãæãå¿ èŠããããŸãã
åœéåã«é¢ããæ³šæïŒãããã¯ãŒã¯é床ãšããŒã¿ã³ã¹ãã¯ãäžçäžã§å€§ããç°ãªãããšãèŠããŠãããŠãã ããã æ¥ç¶ãé ããŠãŒã¶ãŒãããŒã¿äžéããããŠãŒã¶ãŒåãã«ãäœè§£å床ã®ã¢ã»ãããŸãã¯ã¢ããªã±ãŒã·ã§ã³ã®ç°¡ç¥åãããããŒãžã§ã³ãæäŸããããšãæ€èšããŠãã ããã
WebGLã¡ã¢ãªç®¡çã®ä»åŸã®ãã¬ã³ã
WebGLã¡ã¢ãªç®¡çã®åéã¯åžžã«é²åããŠããŸãã ä»åŸã®ãã¬ã³ãã«ã¯æ¬¡ã®ãããªãã®ããããŸãã
- ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ããããã¯ã¹ãã£å§çž®ïŒããåªããå§çž®çãšããã©ãŒãã³ã¹ãæäŸãããæ°ããããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ããããã¯ã¹ãã£å§çž®åœ¢åŒãç»å ŽããŠããŸãã
- GPUäž»å°ã®ã¬ã³ããªã³ã°ïŒGPUäž»å°ã®ã¬ã³ããªã³ã°æè¡ã¯ãŸããŸãæ®åããŠãããGPUãã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã®å¶åŸ¡ã匷åããCPUã®ãªãŒããŒããããåæžã§ããããã«ãªã£ãŠããŸãã
- ä»®æ³ãã¯ã¹ãã£ãªã³ã°ïŒä»®æ³ãã¯ã¹ãã£ãªã³ã°ã䜿çšãããšããã¯ã¹ãã£ã®è¡šç€ºéšåã®ã¿ãã¡ã¢ãªã«ããŒãããããšã«ãããéåžžã«å€§ããªãã¯ã¹ãã£ã䜿çšããŠã·ãŒã³ãã¬ã³ããªã³ã°ã§ããŸãã
çµè«
WebGLã¢ããªã±ãŒã·ã§ã³ã§æé©ãªããã©ãŒãã³ã¹ãéæããã«ã¯ãå¹ççãªGPUã¡ã¢ãªç®¡çãäžå¯æ¬ ã§ãã GPUã¡ã¢ãªã¢ãŒããã¯ãã£ãçè§£ããé©åãªæé©åæè¡ãé©çšããããšã§ãWebGLã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãã¹ã±ãŒã©ããªãã£ãå®å®æ§ãå€§å¹ ã«åäžãããããšãã§ããŸãã ãã¯ã¹ãã£å§çž®ãããããããã³ã°ããããã¡ç®¡çãªã©ã®éå±€çãªã¡ã¢ãªç®¡çæŠç¥ã¯ãGPUã¡ã¢ãªã®äœ¿çšçãæå€§åããã¡ã¢ãªã®ããã«ããã¯ãæå°éã«æããã®ã«åœ¹ç«ã¡ãŸãã ãã¯ã¹ãã£å§çž®ãšããããããã³ã°ã®çµã¿åãããªã©ããã«ãã¬ãã«ã¡ã¢ãªæé©åæè¡ã¯ãããã©ãŒãã³ã¹ãããã«åäžãããããšãã§ããŸãã ã¢ããªã±ãŒã·ã§ã³ããããã¡ã€ãªã³ã°ãããããã°ããŒã«ã䜿çšããŠãã¡ã¢ãªã®ããã«ããã¯ãç¹å®ããã³ãŒããæé©åããããšãå¿ããªãã§ãã ããã ãã®èšäºã§æŠèª¬ãããŠãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãããŸããŸãªããã€ã¹ã§ã¹ã ãŒãºã§å¿çæ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããWebGLã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã